package org.svnadmin.util;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.svnadmin.common.util.PropUtils;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 系统工具
 *
 * @author hewenjie
 * @data 2021/6/24
 */
public class SystemUtil {

    /**
     * 执行系统命令，使用系统默认编码
     *
     * @param charset 编码
     * @param cmds 命令列表，每个元素代表一条命令
     * @return 执行结果
     * @throws IOException IO异常
     * @since 3.1.2
     */
    public static String execForStr(String charset, String... cmds) throws IOException {
        return getResult(exec(cmds), charset);
    }

    /**
     * root 模式下路径转换
     * @param path 路径
     * @param reps Set<String>
     * @return String 0 真实路径 1 补偿url
     */
    public static String[] convertPath(String path, Set<String> reps){
        String[] res = new String[2];
        if(path.endsWith("/")){
            path = path.substring(0,path.length()-1);
        }
        for(String s:reps){
            if(path.contains(s)){
                if(path.startsWith("/")){
                    path = path.substring(1);
                }
                res[0] = StringUtils.isBlank(path.replaceFirst(s,""))?"/":path.replaceFirst(s,"");
                res[1] = s;
                return res;
            }
        }
        res[0] = path;
        res[1] = "";
        return res;
    }

    /**
     * 获取爬虫相关信息
     * @return Map
     */
    public static Map<String,String> reptile(){
       Map<String,String> res = new HashMap<>();
        String mode = PropUtils.get("collab.mode");
        if(mode.equals("remote")){
            res.put("url",PropUtils.get("collab.remote.url"));
            res.put("user",PropUtils.get("collab.remote.user"));
            res.put("ticket",PropUtils.get("collab.remote.ticket"));
            return res;
        }
        res.put("url",PropUtils.get("collab.local.url"));
        res.put("user",PropUtils.get("collab.local.user"));
        res.put("ticket",PropUtils.get("collab.local.ticket"));
        return res;
    }

    /**
     * 获得SVN的home目录
     * @return
     */
    public static String home(){
        String mode = PropUtils.get("collab.mode");
        if(mode.equals("local")){
           return PropUtils.get("collab.local.svn");
        }else if(mode.equals("remote")){
            return PropUtils.get("collab.remote.svn");
        }
       return PropUtils.get("collab.test.svn");
    }

    /**
     * 获得SVN的home目录
     * @return
     */
    public static String repositories(){
        String mode = PropUtils.get("collab.mode");
        if(mode.equals("local")){
            return PropUtils.get("collab.local.repositories");
        }else if(mode.equals("remote")){
            return PropUtils.get("collab.remote.repositories");
        }
        return PropUtils.get("collab.test.repositories");
    }

    /**
	 * 执行命令<br>
	 * 命令带参数时参数可作为其中一个参数，也可以将命令和参数组合为一个字符串传入
	 *
             * @param cmds 命令
	 * @return {@link Process}
	 */
    public static Process exec(String... cmds) {
        if (ArrayUtils.isEmpty(cmds)) {
            throw new NullPointerException("Command is empty !");
        }

        // 单条命令的情况
        if (1 == cmds.length) {
            final String cmd = cmds[0];
            if (StringUtils.isBlank(cmd)) {
                throw new NullPointerException("Command is empty !");
            }
            cmds = cmd.split(" ");
        }
        Process process = null;
        try {
            process = new ProcessBuilder(cmds).redirectErrorStream(true).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return process;
    }

    /**
     * 获取命令执行结果，获取后销毁进程
     *
     * @param process {@link Process} 进程
     * @param charset 编码
     * @return 命令执行结果列表
     * @since 3.1.2
     */
    public static String getResult(Process process, String charset) throws IOException {
        InputStream in = null;
        try {
            in = process.getInputStream();
            return IOUtils.toString(in, charset);
        } finally {
            IOUtils.closeQuietly(in);
            destroy(process);
        }
    }

    /**
     * 销毁进程
     *
     * @param process 进程
     * @since 3.1.2
     */
    public static void destroy(Process process) {
        if (null != process) {
            process.destroy();
        }
    }

}
